package br.com.ucb.invista.dao;

import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;

import br.com.ucb.invista.connection.EntityManagerFactory;
import br.com.ucb.invista.domain.Lancamento;

public class LancamentoDao implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	private EntityManager entityManager;
	private Lancamento lancamento;
	private List<Lancamento> listaLancamentos;
	
	@SuppressWarnings("unchecked")
	public LancamentoDao() {
		this.entityManager = EntityManagerFactory.getEntityManager();
		this.lancamento = new Lancamento();
		this.listaLancamentos = entityManager.createQuery("from Lancamento order by tipoLancamento").getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public List<Lancamento> listar() {
		return entityManager.createQuery("from Lancamento order by tipoLancamento").getResultList();
	}
	
	public Boolean salvar(Lancamento lancamentoParametro) {
		try {
			this.entityManager.getTransaction().begin();
				this.entityManager.persist(lancamentoParametro);
					this.entityManager.getTransaction().commit();
						String mensagemSucesso = "O registro foi Persistido com Sucesso!";
							FacesMessage mensagem = new FacesMessage(FacesMessage.SEVERITY_INFO, mensagemSucesso, "");
								FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return true;
		} catch (Exception exception) {
			this.entityManager.getTransaction().rollback();
			System.out.println("Erro ao tentar Persistir a Entidade: " + exception.getMessage());
			exception.printStackTrace();
		}
		return false;
	}
	
	public Boolean alterar(Lancamento lancamentoParametro) {
		try {
			this.entityManager.getTransaction().begin();
				this.entityManager.merge(lancamentoParametro);
					this.entityManager.getTransaction().commit();
			return true;
		} catch (Exception exception) {
			this.entityManager.getTransaction().rollback();
			System.out.println("Erro ao tentar Persistir a Entidade: " + exception.getMessage());
			exception.printStackTrace();
		}
		return false;
	}

	public Boolean excluir(Lancamento lancamentoParametro) {
		try {
			entityManager.getTransaction().begin();
				entityManager.remove(lancamentoParametro);
					System.out.println("O registro foi Excluido com Sucesso");
						entityManager.getTransaction().commit();
						
			String mensagemSucesso = "O registro foi Excluido com Sucesso!";
			FacesMessage mensagem = new FacesMessage(FacesMessage.SEVERITY_INFO, mensagemSucesso, "");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			
			return true;
		} catch (Exception exception) {	
			System.out.println(exception.getMessage());
		}
		return false;
	}
	
	public Lancamento pesquisaCodigo(Long codigoParametro) {
		return entityManager.find(Lancamento.class, codigoParametro);
	}

	public EntityManager getEntityManager() {
		return entityManager;
	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

	public Lancamento getLancamento() {
		return lancamento;
	}

	public void setLancamento(Lancamento lancamento) {
		this.lancamento = lancamento;
	}

	public List<Lancamento> getListaLancamentos() {
		return listaLancamentos;
	}

	public void setListaLancamentos(List<Lancamento> listaLancamentos) {
		this.listaLancamentos = listaLancamentos;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}
}